package com.lening.yygh.hosp.api;


import com.lening.yygh.common.exception.YyghException;
import com.lening.yygh.common.helper.HttpRequestHelper;
import com.lening.yygh.common.result.Result;
import com.lening.yygh.common.result.ResultCodeEnum;
import com.lening.yygh.hosp.service.HospitalService;
import com.lening.yygh.model.hosp.Hospital;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

@Api(tags = "医院管理API接口")
@RestController
@RequestMapping("/admin/hosp/api/hospital")
public class HospitalApi {

    /**
     * 怎么把数据传递过来，我们需要写一个接口
     * 从医院接口端把数据传递过来，
     * 医院接口我们已经开发好了，拿过来直接使用
     * 可以单独创建一个项目，也可以在该项目里面创建一个模块，都行
     */
    @Resource
    private HospitalService hospitalService;



    @ApiOperation(value = "获取医院信息")
    @PostMapping("/show")
    public Result hospital(HttpServletRequest request) {
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
        //在这里我们需要拿出医院编号，然后使用医院编号去查询出这医院的签名的key
        //然后对这个key进行和9998那边一样的加密方式，进行加密，加密后，进行比较，一样就成了
        //那要是不一样，就失败，相当于比较了密码。相当于登录
        //------签名开始了--------
        String hoscode = (String) paramMap.get("hoscode");
        String sign = (String) paramMap.get("sign");
        //要是医院编码为空，就抛出一个自定义异常
        if(StringUtils.isEmpty(hoscode)||StringUtils.isEmpty(sign)) {
            throw new YyghException(ResultCodeEnum.PARAM_ERROR);
        }
        String mySign = hospitalService.getMySignByHoscode(hoscode);
        if(!sign.equals(mySign)){
            throw new YyghException(ResultCodeEnum.SIGN_ERROR);
        }
        //------签名结束了-------------
        return Result.ok(hospitalService.getByHoscode((String)paramMap.get("hoscode")));
    }


    @GetMapping("/findAll")
    public Result findAll(){
        List<Hospital> list = hospitalService.findAll();
        return Result.ok(list);
    }
    /**
     * 现在我们相当于接口的对接，是不同的平台的来的数据，通过httpcilent来的数据，就是json数据，
     * 我们需要转成java数据进行保存，我们的先接收
     */
    @ApiOperation(value = "上传医院")
    @PostMapping("/saveHospital")
    public Result saveHospital(HttpServletRequest request) {
        /**
         * 这个是医院和平台约定好的数据方式，传递一个map，里面是字符串数据，字符串里面是json，
         * 拿回来之后我们进行转化，转成对象，相当于把数组里面的对象全部拿出来，但是我们只有一个对象
         * 说明：参数使用Map，减少对象封装，有利于签名校验，后续会体验到
         */
        Map<String, String[]> parameterMap = request.getParameterMap();
        //我们自己写的转化类去转化
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);

        //------签名开始了--------
        String hoscode = (String) paramMap.get("hoscode");
        String sign = (String) paramMap.get("sign");
        //要是医院编码为空，就抛出一个自定义异常
        if(StringUtils.isEmpty(hoscode)||StringUtils.isEmpty(sign)) {
            throw new YyghException(ResultCodeEnum.PARAM_ERROR);
        }
        String mySign = hospitalService.getMySignByHoscode(hoscode);
        if(!sign.equals(mySign)){
            throw new YyghException(ResultCodeEnum.SIGN_ERROR);
        }
        //------签名结束了-------------
        /**
         * 我们目前是直接去保存的，因为数据来了需要先鉴权（判断他有没有资格给我们传送数据）
         *  之前我们做过类似的操作是什么呢？我们之前使用httpclient做过香烟和酒水的上传和查询，
         *  当时我们传递了Str1和str2，str1里面有用户名和密码，我们进行登录(这就是接口的鉴权)，
         *  而我们这次使用的是，两边约定好的加密方式，进行加密，也一样的啊
         */

        //这个是处理医院logo的图片的，图片使用了base64进行加密，这个加密是可逆的
        //传输过程中“+”转换为了“ ”，因此我们要转换回来
        String logoDataString = (String)paramMap.get("logoData");
        if(!StringUtils.isEmpty(logoDataString)) {
            String logoData = logoDataString.replaceAll(" ", "+");
            paramMap.put("logoData", logoData);
        }
        hospitalService.save(paramMap);
        return Result.ok();
    }

}
